// Prototypes for internal functions and utilities
void error(const char *fmt, ...);
int runClient(char *clientName, int numMessages, char **messages);
int runServer();
void serverReady(int signal);
bool serverIsReady = false;
// Prototypes for functions to be implemented by students
void server();
void client(char *clientName, int numMessages, char *messages[]);
void verror(const char *fmt, va_list argp)
{
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, argp);
fprintf(stderr, "\n");
}
void error(const char *fmt, ...)
{
va_list argp;
va_start(argp, fmt);
verror(fmt, argp);
va_end(argp);
exit(1);
}
int runServer(int port) {
int forkPID = fork();
if (forkPID < 0)
error("ERROR forking server");
else if (forkPID == 0) {
server();
exit(0);
} else {
printf("Main: Server(%d) launched...\n", forkPID);
}
return forkPID;
}
int runClient(char *clientName, int numMessages, char **messages) {
fflush(stdout);
printf("Launching client %s...\n", clientName);
int forkPID = fork();
if (forkPID < 0)
error("ERROR forking client %s", clientName);
else if (forkPID == 0) {
client(clientName, numMessages, messages);
exit(0);
}
return forkPID;
}
void serverReady(int signal) {
serverIsReady = true;
}
struct client {